package com.panda.web.utils;

import com.itextpdf.layout.Document;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;

import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.draw.DottedLine;

import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.*;
import com.itextpdf.layout.property.HorizontalAlignment;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import com.itextpdf.layout.element.LineSeparator;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;

import static org.apache.fop.fonts.type1.AdobeStandardEncoding.*;

import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.text.pdf.PdfPageEventHelper;

public class AAAUtils {

    public static void main(String[] args) throws IOException {
        String content = "**王伊曼**\n" +
                "女 | 20岁 | 四川省凉山彝族自治州 | 共青团员 | 汉族 | 18113303991\n" +
                "求职意向：前端开发工程师 | 求职地点：成都市、绵阳市\n" +
                "\n" +
                "### 个人优势\n" +
                "1. 具备扎实的前端开发技能，熟练掌握HTML5、CSS3、JavaScript及Vue.js等主流技术，能独立完成前端界面设计与开发；\n" +
                "2. 拥有丰富的校园实践经历，曾担任团委组织全媒体中心部长，管理运营学院官方公众号，累计发布推文200+篇，培养了我严谨的工作意识和较强的责任心；\n" +
                "3. 通过英语四六级考试及计算机二级证书，具备良好的英语沟通能力和计算机应用能力。\n" +
                "\n" +
                "### 教育经历\n" +
                "**成都理工大学**\n" +
                "计算机科学与技术（本科） | 2022.09 - 2026.06\n" +
                "主修课程：数据结构、网络原理、数据库、计算机组成原理、操作系统、JavaWeb\n" +
                "\n" +
                "### 实习经历\n" +
                "**后台管理系统开发**\n" +
                "项目时间：2024.05 - 2024.06\n" +
                "项目描述：为企业打造一款基于SSM架构的企业人事管理系统，涵盖登录、权限分配、信息修改、请假申请、考勤查看、薪资查询等核心功能。\n" +
                "职责与贡献：\n" +
                "1. 负责前端界面设计与实现，使用HTML5、CSS3、JavaScript及Vue.js实现用户登录、信息管理、审批等模块的界面；\n" +
                "2. 与后台API对接，使用Ajax或Axios实现数据的动态加载和提交；\n" +
                "3. 设计响应式布局，适配不同终端（PC端、移动端）；\n" +
                "4. 实现用户角色权限管理，确保不同身份用户只能操作其权限范围内的功能；\n" +
                "5. 优化页面性能，提升加载速度与用户体验。\n" +
                "\n" +
                "### 校园实践\n" +
                "**团委组织全媒体中心**" +
                "部长 | 2022.09 - 2024.09" +
                "工作内容：\n" +
                "1. 管理运营学院官方公众号，累计发布推文200+篇，培养了我严谨的工作意识和较强的责任心；\n" +
                "2. 与各部门对接需求，自主研究排版工具（如秀米、Photoshop），快速掌握新技能并应用；\n" +
                "3. 对部门制度化管理，规范化工作流程，培养了高效严谨的团队。\n" +
                "\n" +
                "### 技能证书\n" +
                "1. 英语四级证书（CET-4）\n" +
                "2. 英语六级证书（CET-6）\n" +
                "3. 计算机二级证书\n" +
                "4. 普通话二级甲等\n" +
                "\n" +
                "### 荣誉奖励\n" +
                "1. 院优秀学生奖学金\n" +
                "2. 院优秀学生干部\n" +
                "3. 第25届蓝桥杯C/C++省二等奖\n" +
                "\n" +
                "### 兴趣爱好\n" +
                "1. 喜欢研究新技术，关注前端开发领域的最新动态，定期学习并实践新技能；\n" +
                "2. 热爱阅读技术书籍，如《JavaScript高级程序设计》、《Vue.js实战》等，不断提升专业能力。";
//        String outputPath = "C:/Users/Administrator/Desktop/常贝医药/简历测试/aaa.pdf";
        Date date = new Date();
        SimpleDateFormat simpleDateFormat  = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
        String format = simpleDateFormat.format(date);
        String outputPath = "C:/Users/Administrator/Desktop/常贝医药/简历测试/"+format+".pdf";
        String picture = "C:/Users/Administrator/Desktop/常贝医药/logo.png";
        generatePdf(content, outputPath, picture);
    }


    // 新增静态常量
    private static final Color TITLE_COLORA = new DeviceGray(0.2f);

//    private static final Color TITLE_COLOR = new DeviceRgb(0.173f, 0.243f, 0.314f);//1
//
    private static final Color TITLE_COLOR = new DeviceRgb(0.173f, 0.243f, 0.314f); // 2
    private static final Color CONTENT_COLOR = new DeviceRgb(0.2f, 0.2f, 0.2f); // 正文颜色
    private static final Color CONTENT_COLORA = new DeviceRgb(0.1f, 0.6f, 0.7f); // 正文颜色
    private static final float TITLE_UNDERLINE_WIDTH = 1.2f;
    private static final float PHOTO_WIDTH = 80f;
    private static final float PHOTO_HEIGHT = 100f;

    // 图标路径（需替换为实际路径）
    private static final String TITLE_ICON = "C:/Users/Administrator/Desktop/常贝医药/tubiao2.png";//"标题图标路径（推荐12x12像素PNG）"
    //    private static final String TITLE_ICON = "/www/wwwroot/comments/picture/tubiao.png";//"标题图标路径（推荐12x12像素PNG）"
    private static final String BACKGROUND_PATH = "C:/Users/Administrator/Desktop/常贝医药/50.png";
    
    //    private static final String BULLET_ICON = "path/to/bullet_icon.png";//"项目符号路径（推荐8x8像素PNG）"
//    private static final String FONT_PATH = "C:/Users/Administrator/Desktop/项目文件/智能求职软件/Fonts/simhei.ttf"; // 黑体字体路径
    private static final String FONT_PATH = "C:/Users/Administrator/Desktop/项目文件/msyh.ttf"; // 黑体字体路径

    public static String generatePdf(String content, String outputPath, String picture) throws IOException {
        PdfWriter writer = new PdfWriter(outputPath);
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf, PageSize.A4);
        document.setMargins(40, 40, 40, 40);

        // 设置全局字体
        PdfFont font = PdfFontFactory.createFont(FONT_PATH, PdfEncodings.IDENTITY_H, true);
        document.setFont(font);

        // 1. 提前加载并验证背景图片
        // 3. 注册背景处理事件（必须在添加内容前注册）
        ImageData backgroundImage = ImageDataFactory.create(BACKGROUND_PATH);
        pdf.addEventHandler(PdfDocumentEvent.START_PAGE, new BackgroundEventHandler(backgroundImage));


        // 解析内容
        String[] lines = content.split("\n");

        // 头部信息处理
        List<String> headerLines = new ArrayList<>();
        if (lines.length > 1) headerLines.add(processDynamicLine(lines[1]));
        if (lines.length > 2 && !lines[2].trim().isEmpty()) {
            headerLines.add(lines[2].trim());
        }

        // 头部表格布局
        Table headerTable = new Table(new float[]{70, 30})
                .useAllAvailableWidth()
                .setMarginTop(20)
                .setMarginBottom(10);

        // 左侧信息区
        Div infoContainer = new Div()
                .setTextAlignment(TextAlignment.CENTER)
                .setVerticalAlignment(VerticalAlignment.MIDDLE);

        // 姓名处理
        Paragraph namePara = new Paragraph(extractName(lines[0]))
                .setBold()
                .setFontSize(20)
                .setFontColor(TITLE_COLORA)
                .setMarginBottom(headerLines.isEmpty() ? 0 : 8);

        infoContainer.add(namePara);

        // 动态信息行
        for (String line : headerLines) {
            infoContainer.add(new Paragraph(line)
                    .setFontSize(12)
                    .setFontColor(CONTENT_COLOR)
                    .setMultipliedLeading(1.2f));
        }

        // 右侧照片区
        Image photo = new Image(ImageDataFactory.create(picture))
                .scaleToFit(PHOTO_WIDTH, PHOTO_HEIGHT);

        // 构建表格
        headerTable.addCell(new Cell()
                .setBorder(Border.NO_BORDER)
                .add(infoContainer)
                .setVerticalAlignment(VerticalAlignment.MIDDLE));

        headerTable.addCell(new Cell()
                .setBorder(Border.NO_BORDER)
                .setHorizontalAlignment(HorizontalAlignment.RIGHT)
                .add(photo));

        document.add(headerTable);

        // 内容模块处理
        Div currentModule = null;
        int moduleItemNumber = 1; // 模块级序号计数器

        for (int i = 3; i < lines.length; i++) {
            String line = lines[i].trim();

            if (line.startsWith("###")) {
                if (currentModule != null) document.add(currentModule);
                currentModule = new Div().setMarginTop(12);
                moduleItemNumber = 1; // 重置序号

                // 带图标的标题
                String title = line.substring(3).trim();
                Paragraph titlePara = new Paragraph()
                        .add(new Image(ImageDataFactory.create(TITLE_ICON))
                                .scaleToFit(15, 15))
                        .add(" " + title)
                        .setBold()
                        .setFontSize(16)
                        .setFontColor(TITLE_COLOR)
                        .setMarginBottom(3);
                currentModule.add(titlePara);
                // 标题下划线
                // 修改后的下划线设置（确保以下代码与您的实际代码一致）
//                currentModule.add(
//                        new LineSeparator(new SolidLine(TITLE_UNDERLINE_WIDTH))
//                                .setStrokeColor(TITLE_COLOR)  // 使用定义的标题颜色
//                                .setOpacity(1.0f)             // 确保不透明度为1
//                                .setMarginTop(1)
//                                .setMarginBottom(5)
//                );
// 修改后的代码：直接设置 LineSeparator 的颜色
                // 在文档中添加红色测试下划线（必须显示为红色）

// 将虚线间距设为0，模拟实线效果
                DottedLine AAAA = new DottedLine(TITLE_UNDERLINE_WIDTH); // 宽度参数化
                AAAA.setGap(0);                   // 消除虚线间距
                AAAA.setColor(TITLE_COLOR);        // 直接设置颜色（关键点）

                currentModule.add(
                        new LineSeparator(AAAA)
                                .setMarginTop(1)
                                .setMarginBottom(5)
                );
            } else if (!line.isEmpty()) {
                if (currentModule != null) {
                    // 带序号的内容处理
                    if (line.startsWith("- ")) {
                        String numberedText = moduleItemNumber++ + ". " + line.substring(2);
                        processListItem(currentModule, numberedText, font);
                    } else if (line.startsWith("**")) {
                        processContentLine(currentModule, line, font);
//                        processContentLine(currentModule, line, font,BOLD_ICON_PATH);
                    } else {
                        processContentLineA(currentModule, line, font);
                    }
                }
            }
        }
        if (currentModule != null) document.add(currentModule);

        document.close();
        return outputPath;
    }

    /**
     * 背景图片处理事件
     */
    private static class BackgroundEventHandler implements IEventHandler {
        private final ImageData backgroundImage;

        public BackgroundEventHandler(ImageData backgroundImage) {
            this.backgroundImage = backgroundImage;
        }

        @Override
        public void handleEvent(Event event) {
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfPage page = docEvent.getPage();
            Rectangle pageSize = page.getPageSize();

            // 创建底层画布（保证背景在内容下方）
            PdfCanvas canvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), docEvent.getDocument());

            // 计算缩放比例（覆盖整个页面）
            canvas.addImage(backgroundImage,
                    pageSize.getWidth(), 0,   // X轴缩放比例（宽度撑满）
                    0, pageSize.getHeight(),  // Y轴缩放比例（高度撑满）
                    0, 0                      // 从页面左下角开始绘制
            );

            canvas.release();
        }
    }

    private static void processContentLineA(Div container, String text, PdfFont font) {
        Paragraph para = new Paragraph()
                .setFontColor(CONTENT_COLOR)
                .setMarginBottom(8)
                .setFixedLeading(14)
                .setTextAlignment(TextAlignment.LEFT);

        // 加粗文本处理
        String[] parts = text.split("\\*\\*");
        boolean isBold = false;
        for (String part : parts) {
            if (!part.isEmpty()) {
                Text segment = new Text(part).setFont(font);
                if (isBold) segment.setBold();
                para.add(segment);
            }
            isBold = !isBold;
        }
        container.add(para);
    }

    private static void processContentLine(Div container, String text, PdfFont font) {
        Paragraph para = new Paragraph()
                .setFontColor(CONTENT_COLOR)
                .setMarginBottom(8)
                .setFixedLeading(14)
                .setTextAlignment(TextAlignment.LEFT);

        // 加粗文本处理
        String[] parts = text.split("\\*\\*");
        boolean isBold = false;
        for (String part : parts) {
            if (!part.isEmpty()) {
                Text segment = new Text(part).setFont(font);
                if (isBold) segment.setBold();
                para.add(segment);
            }
            isBold = !isBold;
        }
        container.add(para);
    }


//private static void processContentLine(Div container, String text, PdfFont font, String iconPath) {
//    Paragraph para = new Paragraph()
//            .setFontColor(CONTENT_COLOR)
//            .setMarginBottom(8)
//            .setFixedLeading(14)
//            .setTextAlignment(TextAlignment.LEFT);
//
//    // 加粗文本处理
//    String[] parts = text.split("\\*\\*");
//    boolean isBold = false;
//    for (String part : parts) {
//        if (!part.isEmpty()) {
//            Text segment = new Text(part).setFont(font);
//            if (isBold) {
//                segment.setBold();
//            }
//            para.add(segment);
//        }
//        isBold = !isBold;
//    }
//
//    // 创建一个容器来包裹文本和图标
//    Div contentWithIcon = new Div().setTextAlignment(TextAlignment.LEFT);
//
//    // 如果有图标路径，添加图标
//    if (iconPath != null && !iconPath.isEmpty()) {
//        try {
//            // 加载图标
//            Image icon = new Image(ImageDataFactory.create(iconPath))
//                    .scaleToFit(12, 12)  // 图标大小，可以根据需要调整
//                    .setTextAlignment(TextAlignment.RIGHT);
//
//            // 将图标添加到容器中
//            contentWithIcon.add(icon);
//        } catch (IOException e) {
//            e.printStackTrace();  // 处理加载图标时的异常
//        }
//    }
//
//    // 将文本添加到容器中
//    contentWithIcon.add(para);
//
//    // 将内容容器添加到主容器中
//    container.add(contentWithIcon);
//}


    private static void processListItem(Div container, String text, PdfFont font) {
//         1. 替换中文标点为带防换行空格的版本（\u00A0 是不可分割空格）
        if (text.startsWith("- ")) {
            processListItem(container, text.substring(2), font);
        } else if (text.startsWith("○ ")) {
            processSubItem(container, text.substring(2), font);
        } else if (text.startsWith("+ ")) {  // 添加对加号的处理
            processSubItem(container, text.substring(2), font); // 你可以定义不同的方法来处理加号项
        } else if (text.startsWith("* ")) { // 如果以 * 开头，去掉星号和空格
            text = text.substring(2); // 删除星号和空格
        } else {

            try {
                Image bullet = new Image(ImageDataFactory.create(""))
                        .scaleToFit(8, 8);
                Paragraph para = new Paragraph()
                        .add(bullet)
                        .add(" " + text)
                        .setFontColor(CONTENT_COLORA)
                        .setMarginLeft(15)
                        .setFixedLeading(14);

                container.add(para);
            } catch (Exception e) {
                // 图标加载失败时降级处理
                Paragraph para = new Paragraph("" + text)
                        .setFontColor(CONTENT_COLORA)
                        .setMarginLeft(15)
                        .setFixedLeading(14);
                container.add(para);
            }
        }

    }

    // 动态行处理逻辑
    private static String processDynamicLine(String rawLine) {
        String[] parts = rawLine.split("\\|");
        List<String> validParts = new ArrayList<>();

        // 有效字段筛选规则
        Set<String> skipPatterns = Set.of(
                "未提及性别",
                "未提及年龄",
                "未提及户籍地",
                "未提及政治面貌",
                "未提及民族"
        );

        for (String part : parts) {
            String trimmed = part.trim();
            if (!trimmed.isEmpty() && !skipPatterns.contains(trimmed)) {
                validParts.add(trimmed);
            }
        }
        return String.join(" | ", validParts);
    }

    // 增强内容处理方法
//    private void processContentLine(Div container, String text, PdfFont font) {
//        // 1. 替换中文标点为带防换行空格的版本（\u00A0 是不可分割空格）
//        if (text.startsWith("- ")) {
//            processListItem(container, text.substring(2), font);
//        } else if (text.startsWith("○ ")) {
//            processSubItem(container, text.substring(2), font);
//        } else if (text.startsWith("+ ")) {  // 添加对加号的处理
//            processSubItem(container, text.substring(2), font); // 你可以定义不同的方法来处理加号项
//        } else if (text.startsWith("* ")) { // 如果以 * 开头，去掉星号和空格
//            text = text.substring(2); // 删除星号和空格
//        }else {
//
//            // 处理普通文本段落
//            Paragraph para = new Paragraph();
//            processBoldText(para, text, font);
//            para.setMarginBottom(8)
//                    .setFixedLeading(14)  // 缩小行高到12磅（原14）
//                    .setTextAlignment(TextAlignment.LEFT)  // 新增：两端对齐
//                    .setMarginLeft(15);
//            container.add(para);
//        }
//    }

//    private void processListItem(Div container, String text, PdfFont font) {
//        Paragraph para = new Paragraph()
//                .setMarginLeft(15)
//                .setMarginBottom(8)
//                .setFixedLeading(14)  // 缩小行高
//                .setTextAlignment(TextAlignment.LEFT);  // 两端对齐
//
//
//        processBoldText(para, text, font); // 处理加粗文本
//
//        // 如果文本中包含加号，直接在段落中显示加号
//        if (text.contains("+")) {
//            Text plusText = new Text(" ").setFont(font);  // 加号文本
//            para.add(plusText);  // 将加号添加到段落
//        }else if (text.startsWith("* ")) { // 如果以 * 开头，去掉星号和空格
//            text = text.substring(2); // 删除星号和空格
//        }
//        container.add(para);
//    }

    private static void processSubItem(Div container, String text, PdfFont font) {
        Paragraph para = new Paragraph()
                .add(String.valueOf(bullet))
                .add(" " + text)
                .setFontColor(CONTENT_COLORA)
                .setMarginLeft(15)
                .setFixedLeading(14);

        processBoldText(para, text, font); // 处理加粗文本

        // 处理加号（+）符号
        if (text.contains("+")) {
            Text plusText = new Text(" ").setFont(font);  // 加号文本
            para.add(plusText);  // 将加号添加到段落
        } else if (text.startsWith("* ")) { // 如果以 * 开头，去掉星号和空格
            text = text.substring(2); // 删除星号和空格
        }

        container.add(para);
    }

    // 新增的辅助方法：解析加粗文本
    private static void processBoldText(Paragraph para, String text, PdfFont font) {
        // 按 ** 拆分文本
        String[] parts = text.split("\\*\\*");
        boolean isBold = false;
        for (String part : parts) {
            if (!part.isEmpty()) {
                Text segment = new Text(part).setFont(font);
                if (isBold) {
                    segment.setBold(); // 将加粗文本应用到对应部分
                }
                para.add(segment);
            }
            isBold = !isBold;  // 每次切换加粗状态
        }
    }

    private static String extractName(String line) {
        return line.replaceAll("\\*", "").trim();
    }
}
